package com.chanct.test;

public class test5 {

	public static void main(String[] args) {
		//创建一个桌子实例
				final Table table = new Table();
				
				Thread t1 = new Thread(){
					public void run(){
						while(true){
							int bean = table.getBean();
							System.out.println(getName()+":"+bean);					
						}
					}
				};
				Thread t2 = new Thread(){
					public void run(){
						while(true){
							int bean = table.getBean();
							//Thread.yield();
							System.out.println(
								getName()+":"+bean
							);					
						}
					}
				};
				t1.start();
				t2.start();
			}

	}

class Table{
	//桌子上有十个豆子
	private int beans = 10;
	/**
	 * 从桌子上拿一个豆子，若桌子上没有
	 * 豆子了会抛出异常
	 * 
	 * synchronized关键字
	 * 若声明在方法上，那么该方法变为同步方法，意思是
	 * 多个线程不能同时访问方法内部。
	 * synchronized修饰方法时，参考的所对象是当前
	 * 方法所属的对象。意思是，当一个线程调用该方法
	 * 时会检查当前方法所属的对象是否被上锁，没有的
	 * 话就给该对象上锁，有的话就在方法外等待，直到
	 * 其他线程将该对象的锁释放。
	 * 
	 * @return
	 */
	public int getBean(){
		if(beans==0){
			throw new RuntimeException("没有豆子了!");
		}
		//Thread.yield();
		return beans--;
	}
}